package com.athena.framework.annotation;

import cn.hutool.core.lang.ClassScaner;
import cn.hutool.core.util.StrUtil;
import com.athena.config.InitConfig;

import java.lang.annotation.Annotation;
import java.util.HashSet;
import java.util.Set;

public interface AnnotationParsing {

    /**
     * 根据包名和注解类型查找类
     *
     * @param packageName
     * @param annotationClass
     * @return
     */
    default Set<Class<?>> findAnnotationClass(String packageName, final Class<? extends Annotation> annotationClass) {
        return ClassScaner.scanPackageByAnnotation(packageName, annotationClass);
    }

    /**
     * 获取扫描的所有的包
     *
     * @return
     */
    default Set<String> getScanPackge() {
        Set<String> packges = new HashSet<>();
        packges.add("com.athena");
        String[] pkgs = InitConfig.base_packge.split(";");
        for (String pkg : pkgs) {
            if (!StrUtil.isBlank(pkg)) {
                packges.add(pkg);
            }
        }
        return packges;
    }

    /**
     * 获取要扫描的包的所有带有传入注解的class
     * @return
     */
    default Set<Class<?>> findAllScanPackgeByAnnotation(Class<? extends Annotation> clazz) {
        Set<String> scanPackge = getScanPackge();
        Set<Class<?>> annotationClass = new HashSet<>();
        for (String pkg : scanPackge) {
            annotationClass.addAll(findAnnotationClass(pkg, clazz));
        }
        return annotationClass;
    }

    /**
     * 开始解析
     */
    void parsing();
}
